package com.yehebl.orm.data.common.dao;

import java.util.Collection;
import java.util.Map;
import java.util.Set;

import com.yehebl.orm.data.common.ICopyProperties;
import com.yehebl.orm.data.lambda.PropertyFun;

/**
 * 新增更新，删除操作接口
 */
public interface IUpdateDao {
    /**
     * 增删改
     *
     * @param sql  sql语句 ?占位符
     * @param objs 参数
     */
    int update(String sql, Class<?> clazz, Object... objs);

    /**
     * 增删改
     *
     * @param sql  sql语句 ?占位符
     * @param objs 参数
     */
    int update(String sql, Object... objs);


    /**
     *  更新部分属性
     * @param entity 实体对象
     * @param params 条件标识
     * @param acceptSet 运行更新的属性
     * @return
     */
    int updateByMap(Object entity, Map<String, Object> params, Set<String> acceptSet);



    /**
     * 更新实体，主键更新不为空的字段
     * @param entity
     * @return
     */
    int updateFilterNull(Object entity);


    /**
     * 根据Map表达式集合更新实体类
     *
     * @param entity      实体类
     * @param params      map表达式更新
     * @param filterField 不允许更新的字段
     */
    int updateFilterByMap(Object entity, Map<String, Object> params, Set<String>  filterField);

    /**
     * 保存数组键值对
     *
     * @param maps      map保存
     * @param tableName 表名
     */
    int[] save(Collection<Map<String, Object>> maps, String tableName);

    /**
     * 保存键值对
     *
     * @param map       map保存
     * @param tableName 表名
     */
    int save(Map<String, Object> map, String tableName);

    /**
     * 新增
     *
     * @param entity 实体类
     */
    int save(Object entity);

    /**
     * 批量新增
     *
     * @param entitys 实体数组类
     */
    <T> int[] save(Collection<T> entitys);

    /**
     * 全部属性修改
     *
     * @param entity 实体类
     */
    int update(Object entity);

    /**
     * 更新部分属性
     *
     * @param entity      实体类
     * @param updateField 允许更新的字段
     */
    int update(Object entity, String... updateField);


    /**
     * 更新实体除过滤字段外
     *
     * @param entity      实体类
     * @param filterField 不允许更新的字段
     */
    int updateFilter(Object entity, String... filterField);



    /**
     * 先查找对象在赋值修改
     *
     * @param entity 实体类
     */
    <T> int update(T entity, ICopyProperties<T> copyProperties, Class<T> clazz);

    /**
     * 全部属性修改
     *
     * @param entitys 实体数组类
     */
    <T> int[] update(Collection<T> entitys);

    /**
     * 根据Map表达式集合更新实体类
     *
     * @param entity      实体类
     * @param params      map表达式更新
     * @param updateField 允许更新的字段
     */
    int updateByMap(Object entity, Map<String, Object> params, String... updateField);

    /**
     * 根据Map表达式集合更新实体类
     *
     * @param entity      实体类
     * @param params      map表达式更新
     * @param filterField 不允许更新的字段
     */
     int updateFilterByMap(Object entity, Map<String, Object> params, String... filterField);

    /**
     * 删除实体
     *
     * @param entity 实体类
     */
    int delete(Object entity);

    /**
     * 删除实体集合
     *
     * @param entitys 实体类数组
     */
    <T> int[] delete(Collection<T> entitys);

    /**
     * id删除数据
     *
     * @param id    主键
     * @param clazz 删除的类型
     */
    <T> int deleteById(Object id, Class<T> clazz);

    /**
     * ids 删除数据 逗号分隔
     *
     * @param ids id逗号分隔
     * @param clazz 删除的类型
     */
    <T> int deleteIn(String ids, Class<T> clazz);

    /**
     * 表达式删除数据
     *
     * @param expression 表达式
     * @param value 值
     * @param clazz 操作的类
     */
    <T> int deleteByExpression(String expression, String value, Class<T> clazz);

    /**
     * Map 表达式条件集合删除数据
     *
     * @param params 表达式删除
     * @param clazz 操作的实体类
     */
    <T> int deleteByMap(Map<String, Object> params, Class<T> clazz);


}
